/***********************************************************************  
 *   @package：cn.wj.base.dao，@class-name：BaseDaoImp.java   
 *   @copyright     Copyright:   2015-2016     
 *   @creator       wenjie 
 *   @create-time   2016年1月10日   下午2:13:16   
 *   @revision      $Id: 1.0    
 ***********************************************************************/
package cn.wj.base.dao;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import cn.wj.base.util.Page;
import cn.wj.base.util.SqlGenerator;

public abstract class BaseDaoImp<T,PK> extends SimpleJDBC<T> implements BaseDao<T,PK> {
// 可以使用擦除来获得类型！ 也可以让子类来提供货获得类型的方法。最好后者谁用谁是实现！
//	private Class<T> entryClass;
//	public BaseDaoImp() {
//		this.entryClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
//	}
	public abstract Class<T> getEntryClass(); 
	@Override
	public void save(T entry) {
		String IdName = SqlGenerator.getId(entry.getClass());
		try {
			Field Id = entry.getClass().getDeclaredField(IdName);
			Map<String, List<Object>> map = SqlGenerator.getInsertSql(entry);
			for (Entry<String, List<Object>> en : map.entrySet()) {
				Object Idvaue =update(en.getKey(), en.getValue(),Id.getType());
				Id.setAccessible(true);
				if(Idvaue!=null)Id.set(entry,Idvaue);
			}
		} catch (NoSuchFieldException | IllegalAccessException e) {
			System.out.println("保存实体是出错!" + e.getMessage());
		}

	}

	@Override
	public void update(T entry) {
		Map<String, List<Object>> map = SqlGenerator.getUpdateSql(entry);
		for (Entry<String, List<Object>> en : map.entrySet()) {
			super.update(en.getKey(), en.getValue());
		}
	}

	@Override
	public void delete(PK id) {
		super.delete(SqlGenerator.getDeleteSql(getEntryClass()), id);
	}

	@Override
	public void delete(String columnName, Object columnValue) {
		super.delete(SqlGenerator.getDeleteSql(getEntryClass(), columnName), columnValue);
	}

	@Override
	public T getById(PK id) {
		return (T) super.queryForObject(SqlGenerator.getByIdSql(getEntryClass()), getEntryClass(), id);
	}
	
	@Override
	public List<T> getPage(int pageIndex, int pageSize) {
		Object parm[]={pageIndex,pageSize};
		return super.query(SqlGenerator.getPageSql(getEntryClass()), getEntryClass(),parm);
	}
	 
	@Override
	public List<T> getAll() {
		return super.query(SqlGenerator.getAllSql(getEntryClass()), getEntryClass());
	}
	
	public Object queryForObject(String sql, Class clazz, Object... objects) {
		return super.queryForObject(sql, clazz, objects);
	}
	public List query(String sql, Class clazz, Object... objects) {
		return super.query(sql, clazz, objects);
	}
	 
}
